﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using GazelDoor.Model;

namespace GazelDoor.Controlli
{
    public class ctrlPersona
    {
        private Persona persona;

        public ctrlPersona(Persona persona)
        {
            this.persona = persona;
        }

        public DataTable SelectAlunniCorsoAttivitàAttuale(Guid idAttività)
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            DataTable dataTable = new DataTable();
            string query = "SELECT Persone.id AS Id, Persone.nome AS Nome, Persone.cognome AS Cognome"
                            + " FROM Persone INNER JOIN Attivita ON Persone.idattivita = Attivita.id"
                            + " WHERE Attivita.id = '"+idAttività+"'";
            SqlDataAdapter sda = new SqlDataAdapter(query, conn.Connessione);
            sda.Fill(dataTable);
            return dataTable;
        }

        public DataTable SelectAllAlunniNonImpegnati()
        {
            DataTable data = new DataTable();

            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            SqlDataAdapter com = new SqlDataAdapter("SELECT Persone.id AS Id, Persone.nome AS Nome, Persone.cognome AS Cognome "
                        + " FROM Persone LEFT JOIN "
                        + " Alunni ON Persone.id = Alunni.id "
                        + " WHERE Persone.idattivita IS NULL ", provaConnessione);
            com.Fill(data);

            return data;
        }

        public DataTable SelectAllAlunniCorsoFinito()
        {
            DataTable data = new DataTable();

            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            SqlDataAdapter com = new SqlDataAdapter("SELECT Persone.id AS Id,Persone.nome AS Nome, Persone.cognome AS Cognome, MAX(DettaglioAttivita.giorno) AS MaxGiorno, Persone.idattivita, Persone.id, Persone.idtessera, Persone.note "
                    + " FROM DettaglioAttivita INNER JOIN "
                    + " Attivita ON DettaglioAttivita.idattivita = Attivita.id RIGHT OUTER JOIN "
                    + " Persone ON Attivita.id = Persone.idattivita "
                    + " GROUP BY Persone.id, Persone.cognome, Persone.nome, Persone.idattivita, Persone.idtessera, Persone.note "
                    + " HAVING (MAX(DettaglioAttivita.giorno) < { fn NOW() }) OR "
                    + " (Persone.idattivita IS NULL)", provaConnessione);

            com.Fill(data);
            return data;
        }

        public DataTable SelectTableAll()
        {
            DataTable data = new DataTable();

            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            SqlDataAdapter com = new SqlDataAdapter(@"
SELECT       Persone.id As Id, Persone.nome, Persone.cognome, Persone.note, Alunni.id AS idAlunno, Dipendenti.id AS idDipendente, Docenti.id AS idDocente
FROM         Persone LEFT OUTER JOIN
                      Docenti ON Persone.id = Docenti.id LEFT OUTER JOIN
                      Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                      Alunni ON Persone.id = Alunni.id", provaConnessione);
            com.Fill(data);
            data.Columns.Add("Tipo");

            foreach (DataRow dr in data.Rows)
            {
                if (!string.IsNullOrEmpty(Convert.ToString(dr[3]))) dr["Tipo"] = "Alunno";
                if (!string.IsNullOrEmpty(Convert.ToString(dr[4]))) dr["Tipo"] = "Dipendente";
                if (!string.IsNullOrEmpty(Convert.ToString(dr[5]))) dr["Tipo"] = "Docente";
            }
            return data;
        }

        public Persona SelectObjectPersonaById(Guid idPersona)
        {
            DataTable data = new DataTable();

            Controlli.GazelConnessione con = Controlli.GazelConnessione.Istance();
            SqlConnection conn = con.Connessione;

            string query = @"
            SELECT     Persone.id AS IdPersona, Persone.cognome AS CognomePersona, Persone.nome AS NomePersona, Persone.note AS NotePersona,Persone.idtessera AS IdTessera, Alunni.id AS IdAlunno, Dipendenti.id AS IdDipendente, Docenti.id AS IdDocente
            FROM       Persone LEFT OUTER JOIN
                       Alunni ON Persone.id = Alunni.id LEFT OUTER JOIN
                       Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                       Docenti ON Persone.id = Docenti.id
                       WHERE Persone.id = '" + idPersona + "'";
            SqlDataAdapter adapter = new SqlDataAdapter(query, conn);
            adapter.Fill(data);

            // List<Persona> listaPersone = new List<Persona>();

            //  foreach (DataRow riga in data.Rows)
            //  {
            DataRow riga = data.Rows[0];
            Persona persona = null;
            if (riga[0].Equals(riga[5])) //alunno
            {
                persona = new Alunno();
            }
            if (riga[0].Equals(riga[6])) //dipendente
            {
                persona = new Dipendente();
            }
            if (riga[0].Equals(riga[7])) //docente
            {
                persona = new Docente();
            }
            persona.Id = (Guid)data.Rows[0][data.Columns["IdPersona"]];
            persona.Cognome = (string)data.Rows[0][data.Columns["CognomePersona"]];
            persona.Nome = (string)data.Rows[0][data.Columns["NomePersona"]];
            persona.Note = (string)data.Rows[0][data.Columns["NotePersona"]];
            //persona.Tessera = GetTesseraById((Guid)data.Rows[0][data.Columns["IdTessera"]]);
            // }
            this.persona = persona;
            return persona;
        }

        public bool DeletePersone(Guid idDaCancellare)
        {
            Controlli.GazelConnessione con = Controlli.GazelConnessione.Istance();
            persona = this.SelectObjectPersonaById(idDaCancellare);
            if (persona is Alunno)
            {
                string query = " DELETE FROM Alunni WHERE id = @condizione";
                SqlCommand elimina = new SqlCommand(query, con.Connessione);
                elimina.Parameters.AddWithValue("@condizione", idDaCancellare);
                elimina.ExecuteNonQuery();
            }
            if (persona is Dipendente)
            {
                string query = " DELETE FROM Dipendenti WHERE id = @condizione";
                SqlCommand elimina = new SqlCommand(query, con.Connessione);
                elimina.Parameters.AddWithValue("@condizione", idDaCancellare);
                elimina.ExecuteNonQuery();
            }
            if (persona is Docente)
            {
                string query = " DELETE FROM Docenti WHERE id = @condizione";
                SqlCommand elimina = new SqlCommand(query, con.Connessione);
                elimina.Parameters.AddWithValue("@condizione", idDaCancellare);
                elimina.ExecuteNonQuery();
            }
            try
            {
                string queryPersone = " DELETE FROM Persone WHERE id = @condizione";
                SqlCommand eliminaPersone = new SqlCommand(queryPersone, con.Connessione);
                SqlParameter condizione = new SqlParameter();
                condizione.ParameterName = "@condizione";
                condizione.SqlDbType = SqlDbType.UniqueIdentifier;
                condizione.Value = idDaCancellare;
                eliminaPersone.Parameters.Add(condizione);
                eliminaPersone.ExecuteNonQuery();
                return true;
            }
            catch (SqlException sx)
            {
                if (persona is Alunno)
                {
                    InserisciAlunno();
                }
                if (persona is Dipendente)
                {
                    InserisciDipendente();
                }
                if (persona is Docente)
                {
                    InserisciDocente();
                }
                return false;
            }
        }

        public DataTable SelectAll()
        {
            DataTable data = new DataTable();

            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            SqlDataAdapter com = new SqlDataAdapter("select * from Persone", provaConnessione);
            com.Fill(data);

            return data;
        }

        public Persona SelectObjectPersona(Guid idTessera)
        {
            DataTable data = new DataTable();

            Controlli.GazelConnessione con = Controlli.GazelConnessione.Istance();
            SqlConnection conn = con.Connessione;
            string query = @"
            SELECT     Persone.id AS IdPersona, Persone.cognome AS CognomePersona, Persone.nome AS NomePersona, Persone.note AS NotePersona,Persone.idtessera AS IdTessera, Alunni.id AS IdAlunno, Dipendenti.id AS IdDipendente, Docenti.id AS IdDocente
            FROM       Persone LEFT OUTER JOIN
                       Alunni ON Persone.id = Alunni.id LEFT OUTER JOIN
                       Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                       Docenti ON Persone.id = Docenti.id
                       WHERE idtessera = '" + idTessera + "'";
            SqlDataAdapter adapter = new SqlDataAdapter(query, conn);
            adapter.Fill(data);

            // List<Persona> listaPersone = new List<Persona>();

            //  foreach (DataRow riga in data.Rows)
            //  {
            Persona persona = null;
            if (data.Rows[0][data.Columns["IdAlunno"]] != DBNull.Value && data.Rows[0][data.Columns["IdPersona"]].Equals(data.Rows[0][data.Columns["IdAlunno"]])) //alunno
            {
                persona = new Alunno();
            }
            if (data.Rows[0][data.Columns["IdDipendente"]] != DBNull.Value && data.Rows[0][data.Columns["IdPersona"]].Equals(data.Rows[0][data.Columns["IdDipendente"]])) //dipendente
            {
                persona = new Dipendente();
            }
            if (data.Rows[0][data.Columns["IdDocente"]] != DBNull.Value && data.Rows[0][data.Columns["IdPersona"]].Equals(data.Rows[0][data.Columns["IdDocente"]])) //docente
            {
                persona = new Docente();
            }

            persona.Id = (Guid)data.Rows[0][data.Columns["IdPersona"]];
            persona.Cognome = (string)data.Rows[0][data.Columns["CognomePersona"]];
            persona.Nome = (string)data.Rows[0][data.Columns["NomePersona"]];
            persona.Note = (string)data.Rows[0][data.Columns["NotePersona"]];
            persona.Tessera = GetTesseraById((Guid)data.Rows[0][data.Columns["IdTessera"]]);
            // }

            return persona;
        }

        private Tessera GetTesseraById(Guid guid)
        {
            string query  = "SELECT * FROM Tessere"
                            +" WHERE id = '"+guid+"'";
            Tessera tesseraPresa = new Tessera();
            SqlDataAdapter sda = new SqlDataAdapter(query, Controlli.GazelConnessione.Istance().Connessione);
            DataTable data = new DataTable();
            try
            {
                sda.Fill(data);
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            tesseraPresa.Id = guid;
            tesseraPresa.Codice =(string)data.Rows[0][data.Columns["codice"]];
            tesseraPresa.Abilitata = (bool)data.Rows[0][data.Columns["abilitata"]];
            return tesseraPresa;

        }

        public Tessera GetTesseraByCodice(string codice)
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            DataTable dataTable = new DataTable();
            Tessera daRitornare = new Tessera();
            string query = "SELECT * FROM Tessere WHERE codice = '" + codice + "'";

            try
            {
                SqlDataAdapter sda = new SqlDataAdapter(query, conn.Connessione);
                sda.Fill(dataTable);
            }
            catch (SqlException ex)
            {
                MessageBox.Show("Errore getTesseraByCodice" + ex.Message);
            }

            if (dataTable.Rows.Count > 0)
            {
                daRitornare.Id = (Guid)dataTable.Rows[0]["id"];
                daRitornare.Codice = (string)dataTable.Rows[0]["codice"];
                daRitornare.Abilitata = (bool)dataTable.Rows[0]["abilitata"];
                return daRitornare;
            }
            return null;
        }

        public DataTable SelectAllAlunni()
        {
            DataTable data = new DataTable();

            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            SqlDataAdapter com = new SqlDataAdapter("SELECT Persone.id AS Id, Persone.nome AS Nome, Persone.cognome AS Cognome "
                        + " FROM Persone LEFT JOIN "
                        + " Alunni ON Persone.id = Alunni.id", provaConnessione);
            com.Fill(data);

            return data;
        }

        private bool ControllaUnivocitaTessera()
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand selectCodiceTessera = new SqlCommand(
                "Select * from Tessere where codice='" + persona.Tessera.Codice + "'"
                , provaConnessione);

            return true;
        }

        private void AggiungiTessera()
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand insert = new SqlCommand(@"
                Insert into Tessere
                (id,codice,abilitata)
                values(@id,@codice,@abilitata)
            ", provaConnessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Tessera.Id;
            insert.Parameters.Add(id);

            SqlParameter codice = new SqlParameter();

            codice.ParameterName = "@codice";
            codice.DbType = DbType.String;
            codice.Value = persona.Tessera.Codice;
            insert.Parameters.Add(codice);

            SqlParameter abilitata = new SqlParameter();

            abilitata.ParameterName = "@abilitata";
            abilitata.DbType = DbType.Boolean;
            abilitata.Value = persona.Tessera.Abilitata;
            insert.Parameters.Add(abilitata);

            insert.ExecuteNonQuery();
        }

        private void UpdateTessera(Tessera tessera)
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand insert = new SqlCommand(@"
                Update Tessere set
                abilitata = @abilitata
                where id = @id
            ", provaConnessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = tessera.Id;
            insert.Parameters.Add(id);

            SqlParameter abilitata = new SqlParameter();

            abilitata.ParameterName = "@abilitata";
            abilitata.DbType = DbType.Boolean;
            abilitata.Value = tessera.Abilitata;
            insert.Parameters.Add(abilitata);

            insert.ExecuteNonQuery();
        }

        public int setPersonaToAttivita(Attivita attivita)
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            string sql;
            sql = "UPDATE Persone SET idattivita='" + attivita.Id + "'"
                + " WHERE id='" + persona.Id + "'";
            SqlCommand cmd = new SqlCommand(sql, provaConnessione);
            return cmd.ExecuteNonQuery();
        }

        public int setPersonaToAttivitaNULL(Attivita attivita)
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            string sql;
            sql = "UPDATE Persone SET idattivita=NULL"
                + " WHERE id='" + persona.Id + "'";
            SqlCommand cmd = new SqlCommand(sql, provaConnessione);
            return cmd.ExecuteNonQuery();
        }

        private void InserisciDipendente()
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand insertDip = new SqlCommand(@"
                Insert into Dipendenti
                (id)
                values(@id)
            ", provaConnessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Id;
            insertDip.Parameters.Add(id);

            insertDip.ExecuteNonQuery();
        }

        private void InserisciAlunno()
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand insertAlunn = new SqlCommand(@"
                Insert into Alunni
                (id)
                values(@id)
            ", provaConnessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Id;
            insertAlunn.Parameters.Add(id);

            insertAlunn.ExecuteNonQuery();
        }

        private void InserisciDocente()
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand insertDoc = new SqlCommand(@"
                Insert into Docenti
                (id)
                values(@id)
            ", provaConnessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Id;
            insertDoc.Parameters.Add(id);

            insertDoc.ExecuteNonQuery();
        }

        public void UpdatePersonaTessera() // da finire
        {
            if (!ControllaUnivocitaTessera())
                return;
            AggiungiTessera();
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand insert = new SqlCommand(@"
                UPDATE Persone set
            ", provaConnessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Id;
            insert.Parameters.Add(id);

            SqlParameter nome = new SqlParameter();

            nome.ParameterName = "@nome";
            nome.DbType = DbType.String;
            nome.Value = persona.Nome;
            insert.Parameters.Add(nome);

            SqlParameter cognome = new SqlParameter();

            cognome.ParameterName = "@cognome";
            cognome.DbType = DbType.String;
            cognome.Value = persona.Cognome;
            insert.Parameters.Add(cognome);

            SqlParameter idTessera = new SqlParameter();

            idTessera.ParameterName = "@idtessera";
            idTessera.DbType = DbType.Guid;
            idTessera.Value = persona.Tessera.Id;
            insert.Parameters.Add(idTessera);

            SqlParameter note = new SqlParameter();

            note.ParameterName = "@note";
            note.DbType = DbType.String;
            note.Value = persona.Note;
            insert.Parameters.Add(note);

            insert.ExecuteNonQuery();

            if (persona is Dipendente)
            {
                InserisciDipendente();
                MessageBox.Show("Dipendente inserito correttamente");
            }
            else if (persona is Alunno)
            {
                InserisciAlunno();
                MessageBox.Show("Alunno inserito correttamente");
            }
            else if (persona is Docente)
            {
                InserisciDocente();
                MessageBox.Show("Docente inserito correttamente");
            }
        }

        public void AnnullaAssociazioneTessera(Persona personaPrecedente)
        {
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            string query = "Update Persone set idtessera = NULL Where id = '" + personaPrecedente.Id + "'";

            SqlCommand update = new SqlCommand(query, conn.Connessione);
            update.ExecuteNonQuery();
        }

        public void InsertPersonaTessera(bool aggiungi = false)
        {
            if (!ControllaUnivocitaTessera())
                return;

            if (aggiungi == true)
                AggiungiTessera();
            else
            {
                UpdateTessera(persona.Tessera);
            }
            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();

            SqlConnection provaConnessione = conn.Connessione;

            SqlCommand insertPersona = new SqlCommand(@"
                Insert into Persone
                (id,nome,cognome,idtessera,note)
                values(@id,@nome,@cognome,@idtessera,@note)
            ", provaConnessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Id;
            insertPersona.Parameters.Add(id);

            SqlParameter nome = new SqlParameter();

            nome.ParameterName = "@nome";
            nome.DbType = DbType.String;
            nome.Value = persona.Nome;
            insertPersona.Parameters.Add(nome);

            SqlParameter cognome = new SqlParameter();

            cognome.ParameterName = "@cognome";
            cognome.DbType = DbType.String;
            cognome.Value = persona.Cognome;
            insertPersona.Parameters.Add(cognome);

            SqlParameter idTessera = new SqlParameter();

            idTessera.ParameterName = "@idtessera";
            idTessera.DbType = DbType.Guid;
            idTessera.Value = persona.Tessera.Id;
            insertPersona.Parameters.Add(idTessera);

            SqlParameter note = new SqlParameter();

            note.ParameterName = "@note";
            note.DbType = DbType.String;
            note.Value = persona.Note;
            insertPersona.Parameters.Add(note);
            try
            {
                insertPersona.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            if (persona is Dipendente)
            {
                InserisciDipendente();
                MessageBox.Show("Dipendente inserito correttamente");
            }
            else if (persona is Alunno)
            {
                InserisciAlunno();
                MessageBox.Show("Alunno inserito correttamente");
            }
            else if (persona is Docente)
            {
                InserisciDocente();
                MessageBox.Show("Docente inserito correttamente");
            }
        }

        public DataTable VerificaPersoneAttivita(Guid id)
        {
            DataTable dt = new DataTable();

            Controlli.GazelConnessione conn = Controlli.GazelConnessione.Istance();
            SqlConnection provaConnessione = conn.Connessione;

            SqlDataAdapter com = new SqlDataAdapter("select cognome, nome from persone where id='" + id + "' ", provaConnessione);

            com.Fill(dt);

            return dt;
        }
    }
}